容器和虛擬機(jī) (VM) 相似且互補(bǔ)。兩者都增強(qiáng)了應(yīng)用程序的可移植性、效率并增強(qiáng)了組織中的開發(fā)和運(yùn)營 (DevOps),盡管存在架構(gòu)差異。容器在操作系統(tǒng) (OS) 級別創(chuàng)建抽象層,允許開發(fā)人員專注于應(yīng)用程序,而運(yùn)營團(tuán)隊(duì)則專注于基礎(chǔ)架構(gòu)。相比之下,虛擬機(jī)利用管理程序通過應(yīng)用程序開發(fā)復(fù)制底層硬件資源的功能。在容器還是 VM 之間進(jìn)行選擇取決于部署系統(tǒng)的要求。
容器和虛擬機(jī)如何工作
容器和 VM 都是創(chuàng)建獨(dú)立的虛擬化程序包的技術(shù)。因此,了解它們?nèi)绾喂ぷ鞯淖詈唵畏椒ㄊ菑亩x“虛擬化”開始。虛擬化允許您將操作系統(tǒng)與底層硬件隔離開來。因此,您可以在同一臺物理機(jī)上運(yùn)行多個(gè)操作系統(tǒng),例如 Linux 和 Windows。
傳統(tǒng)的虛擬化依賴于管理程序來創(chuàng)建虛擬機(jī)。管理程序隔離和編排可用的硬件資源,例如處理器、內(nèi)存、存儲和網(wǎng)絡(luò),根據(jù)需要將一部分分配給每個(gè)虛擬機(jī)。
什么是虛擬機(jī)?
最終,每個(gè) VM 都包含來賓操作系統(tǒng)、來賓操作系統(tǒng)需要運(yùn)行的虛擬化硬件以及已安裝的應(yīng)用程序,包括相關(guān)的依賴項(xiàng)和庫。通常,VM 作為獨(dú)立的 PC運(yùn)行,底層基礎(chǔ)設(shè)施可以針對不同的工作負(fù)載運(yùn)行多個(gè)獨(dú)立的虛擬機(jī)。由于每個(gè)虛擬機(jī)都需要自己的來賓操作系統(tǒng),因此虛擬機(jī)操作是資源密集型的。在大多數(shù)情況下,您很少會(huì)發(fā)現(xiàn)工作負(fù)載操作會(huì)占用 VM 中的所有可用資源。
您也無法在虛擬化環(huán)境中運(yùn)行單獨(dú)的應(yīng)用程序功能,除非您為不同的軟件模塊化元素使用單獨(dú)的 VM。此外,要在不同的虛擬機(jī)或數(shù)據(jù)中心之間遷移應(yīng)用程序,您必須將整個(gè)操作系統(tǒng)與其一起遷移。正是這個(gè)缺點(diǎn)使得容器的采用和使用得到了普及。
什么是容器?
與使用虛擬化硬件的 VM 不同,容器將操作系統(tǒng)虛擬化,允許軟件的獨(dú)立、模塊化和不同的功能獨(dú)立執(zhí)行。每個(gè)容器共享只讀主機(jī)操作系統(tǒng)的內(nèi)核,包括二進(jìn)制文件和庫。
容器在它們運(yùn)行的??每個(gè)實(shí)例中不需要來賓操作系統(tǒng)——它們只是使用主機(jī)操作系統(tǒng)的資源和功能。共享操作系統(tǒng)資源允許服務(wù)器在同一個(gè)操作系統(tǒng)上運(yùn)行多個(gè)工作負(fù)載。因此,容器很輕——它們占用幾兆字節(jié)——而且與 VM 相比速度很快。
與 VM 一樣,容器允許開發(fā)人員提高物理機(jī)的處理器、內(nèi)存和存儲利用率。然而,容器甚至走得更遠(yuǎn)。它們促進(jìn)了微服務(wù)架構(gòu),您可以在其中高效地精細(xì)部署和擴(kuò)展應(yīng)用程序組件。
虛擬化的工作原理
虛擬化是使用軟件在硬件之上構(gòu)建抽象層的技術(shù),允許將單個(gè)計(jì)算機(jī)的硬件拆分為多個(gè)虛擬計(jì)算機(jī)。管理程序是一個(gè)微小的軟件層,它允許各種操作系統(tǒng)在共享相同物理計(jì)算機(jī)資源的同時(shí)同時(shí)運(yùn)行。當(dāng)管理程序安裝在數(shù)據(jù)中心的物理計(jì)算機(jī)或網(wǎng)絡(luò)(也稱為裸機(jī)服務(wù)器)上時(shí),它允許操作系統(tǒng)和應(yīng)用程序與硬件分離。然后它可以被分成多個(gè)獨(dú)立的“虛擬機(jī)”。
容器和虛擬機(jī)有何不同
容器和 VM在許多方面有所不同,如下表所總結(jié):
特征 | 容器 | 虛擬機(jī) |
操作系統(tǒng) | 它僅運(yùn)行操作系統(tǒng)的用戶模式部分。您可以通過僅選擇應(yīng)用程序需要的服務(wù)來自定義容器。 | 它運(yùn)行整個(gè)操作系統(tǒng),包括內(nèi)核。它是資源密集型的。 |
隔離 | 它不會(huì)將主機(jī)與其他容器完全隔離。因此,與虛擬機(jī)相比,它不提供強(qiáng)大的安全邊界。 | 它提供了主機(jī)操作系統(tǒng)和其他虛擬機(jī)之間的完全隔離。因此,它為在同一服務(wù)器或集群上托管應(yīng)用程序的組織提供了強(qiáng)大的安全性。 |
來賓兼容性 | 它運(yùn)行在與主機(jī)相同的操作系統(tǒng)版本上。 | 它可以運(yùn)行 VM 內(nèi)的任何操作系統(tǒng)。 |
操作系統(tǒng)更新和升級 | 您可以通過兩種方式更新或升級容器的操作系統(tǒng)文件。首先,您可以編輯和重建圖像文件。其次,您可以使用容器化編排器。 | 您可以通過在每個(gè)虛擬機(jī)上下載和安裝更新來更新或升級 VM 的操作系統(tǒng)。如果您有很多 VM,這將是乏味且耗時(shí)的。 |
聯(lián)網(wǎng) | 它使用虛擬網(wǎng)絡(luò)適配器 (VNA) 的隔離視圖。這提供了主機(jī)防火墻與其他容器共享的輕量級虛擬化。 | 它使用具有完全虛擬化的 VNA。 |
容錯(cuò)性 | 萬一集群節(jié)點(diǎn)出現(xiàn)故障,編排器會(huì)自動(dòng)將在其上運(yùn)行的任何容器重新創(chuàng)建到另一個(gè)節(jié)點(diǎn)。 | 虛擬機(jī)快速故障轉(zhuǎn)移到集群中的另一個(gè)節(jié)點(diǎn),來賓操作系統(tǒng)自動(dòng)重新啟動(dòng)。 |
負(fù)載均衡 | 編排器自動(dòng)啟動(dòng)或停止集群節(jié)點(diǎn)上的容器以處理負(fù)載和可用性的變化。容器不動(dòng)。 | VM 負(fù)載平衡將正在運(yùn)行的虛擬機(jī)移動(dòng)到故障轉(zhuǎn)移群集中的其他節(jié)點(diǎn)。 |
如何在容器和虛擬機(jī) (VM) 之間做出選擇
容器和 VM 各有利弊,因此會(huì)影響您做出的決定。最終,您的選擇主要取決于兩件事:
- 您是否需要一個(gè)輕量級實(shí)例以便在裸機(jī)系統(tǒng)之間輕松遷移?
- 您想要一個(gè)半永久性的 IT 資源分配解決方案嗎?
集裝箱
容器很輕。您可以在不同的服務(wù)器和不同的云部署之間快速移動(dòng)它們,包括私有、公共和混合環(huán)境。如果您的首要任務(wù)是在最少數(shù)量的服務(wù)器上最大化應(yīng)用程序的數(shù)量,則可以考慮使用容器。
如果您想部署利用微服務(wù)架構(gòu)的云原生應(yīng)用程序,以實(shí)現(xiàn)跨私有云、公共云和混合云環(huán)境的一致開發(fā)和部署,容器也是理想之選。容器的唯一警告是它們必須與底層操作系統(tǒng)兼容。
如果你想,你可以考慮容器:
- 實(shí)施云原生應(yīng)用程序。
- 封裝微服務(wù)。
- 堅(jiān)持 DevOps 和持續(xù)集成/持續(xù)部署 (CI/CD) 實(shí)踐。
- 在共享同一操作系統(tǒng)的不同 IT 環(huán)境中移動(dòng)可擴(kuò)展的應(yīng)用程序。
虛擬機(jī)
相比之下,虛擬機(jī)可以運(yùn)行比單個(gè)容器更多的操作。VM 非常適合需要操作系統(tǒng)的所有資源和功能的單一工作負(fù)載。然而,擴(kuò)展的功能使得 VM 的可移植性不如容器。如果你想:你可以考慮虛擬機(jī):
- 托管遺留和單體應(yīng)用程序。
- 配置服務(wù)器、存儲和網(wǎng)絡(luò)等 IT 資源。
- 隔離有風(fēng)險(xiǎn)的開發(fā)環(huán)境。
何時(shí)一起使用容器和虛擬機(jī)
您可能想知道為什么有人想要同時(shí)使用容器和虛擬機(jī)。好吧,容器共享主機(jī)的操作系統(tǒng)內(nèi)核,包括二進(jìn)制文件和庫。跨不同發(fā)行版運(yùn)行 Linux 容器不是問題,因?yàn)榇蠖鄶?shù) Linux 發(fā)行版都構(gòu)建在同一內(nèi)核之上。
例如,您可以在基于 CentOS 的主機(jī)上高效地運(yùn)行 Ubuntu 容器。但是,內(nèi)核共享事實(shí)意味著您不能在 Linux 主機(jī)上運(yùn)行 Windows 容器,反之亦然。要運(yùn)行這些容器,您需要在各自的主機(jī)上創(chuàng)建一個(gè) VM。例如,您可以在 Linux 主機(jī)上創(chuàng)建 Windows VM 來運(yùn)行 Windows 容器。這是可能的,因?yàn)樘摂M機(jī)利用自己的操作系統(tǒng),允許操作系統(tǒng)支持容器引擎。
在 VM 內(nèi)運(yùn)行容器可將其隔離,從而限制漏洞攻擊的范圍。例如,如果 500 個(gè)容器在裸機(jī)服務(wù)器上共享一個(gè)操作系統(tǒng)內(nèi)核,并且操作系統(tǒng)出現(xiàn)故障,則所有 500 個(gè)容器都會(huì)受到損害。另一方面,如果托管 50 個(gè)或更少容器的 VM 受到威脅,它只會(huì)影響這些容器。此故障不會(huì)影響同一服務(wù)器或集群中運(yùn)行不同容器的其他虛擬機(jī)。
您還可以集成容器和 VM 以實(shí)現(xiàn)容量優(yōu)化。虛擬化在企業(yè) IT 領(lǐng)域很流行,因?yàn)樗龠M(jìn)了服務(wù)器的利用。一臺服務(wù)器可以托管多個(gè)虛擬機(jī),每個(gè)虛擬機(jī)托管多個(gè)容器主機(jī)。此外,每臺服務(wù)器都可以托管許多傳統(tǒng)的單體虛擬機(jī)。將容器與傳統(tǒng)的整體式 VM 集成使 IT 管理員能夠最大限度地利用物理服務(wù)器。